home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / listhelp.i < prev    next >
Text File  |  1997-10-26  |  41KB  |  1,278 lines

  1. IMPLEMENTATION MODULE ListHelp;
  2.  
  3. (*==============================================================*
  4.  * Modul:               Modul zur Verwaltung der Abrufboxen     *
  5.  * Autor:               Dirk Steins, Jo G”ttker-Schnetmann      *
  6.  * erstellt am:         10.04.1992                              *
  7.  * letzte Žnderung am:  10.04.1992                              *
  8.  * Version:             1.0                                     *
  9.  * Interne Version:     V#0001                                  *
  10.  *==============================================================*
  11.  
  12.  *----------------------------------------------------------------------------
  13.  * Datum    Vers. Autor  Žnderung (Arbeitsbericht)                            
  14.  *----------------------------------------------------------------------------
  15.  *----------------------------------------------------------------------------
  16.  *)
  17.  
  18. FROM SYSTEM  IMPORT ADDRESS, TSIZE, ADR, CADR, CAST, ASSEMBLER, CALLSYS;
  19. FROM Storage IMPORT ALLOCATE, DEALLOCATE;
  20. IMPORT Lists;
  21. IMPORT Strings;
  22. IMPORT StrConv;
  23. IMPORT GrafBase;
  24. IMPORT BinOps;
  25.  
  26. FROM Void         IMPORT v;
  27. FROM ListDl       IMPORT doListDial, specialButHdler, dummyInLoop, inLoopProc, ldElems;
  28. IMPORT ListDl;
  29. FROM VDIUtil IMPORT FormHandle;
  30. IMPORT data;
  31. IMPORT dataSys;
  32. IMPORT MausTauschrsc;
  33. IMPORT MTE;
  34. IMPORT GroupSelect;
  35. IMPORT ListMan;
  36. IMPORT CatGlobal;
  37. IMPORT ConfVars;
  38. IMPORT Varnames;
  39. IMPORT CatHelp;
  40.  
  41. IMPORT MagicAES;
  42. IMPORT MagicDOS;
  43. IMPORT MagicStrings;
  44.  
  45. IMPORT mtAppl;
  46. IMPORT mtDials;
  47. IMPORT mtAlerts;
  48. IMPORT mtUtils;
  49.  
  50. IMPORT WinDials;
  51.  
  52.  
  53. VAR gruppen, adr : ADDRESS;
  54.  
  55. VAR lastGroup : ARRAY [0..255] OF CHAR;
  56.     globalLength : INTEGER;
  57.     groupDialIsOpen: BOOLEAN;
  58.     nameDialIsOpen : BOOLEAN;
  59.  
  60.  
  61. (*------------------------------------------------------------------------*)
  62.  
  63. TYPE envRecord = RECORD
  64.                    mode:    groupSelectMode;
  65.                    isReadMode: BOOLEAN;
  66.                    exitBut   : INTEGER;
  67.                  END;
  68.      envRecPtr = POINTER TO envRecord;
  69.      
  70. VAR grList  : Lists.List;
  71.     clipEntry   : GroupSelect.groupPtr;
  72.  
  73. PROCEDURE selGrEntry (entry, env : ADDRESS; line : INTEGER): BOOLEAN;
  74.   VAR gr : GroupSelect.groupPtr;
  75.       str: ARRAY [0..255] OF CHAR;
  76. BEGIN
  77.   gr := entry;
  78.   IF gr = NIL THEN RETURN FALSE END;
  79.   gr^.selected := ~gr^.selected;
  80.   IF gr^.selected & (line >= 0) THEN
  81.     mtUtils.SetObjcString (gruppen, MausTauschrsc.newgroup, gr^.name^); 
  82.     WinDials.WinDialDraw (gruppen, MausTauschrsc.newgroup, 0, v.r, FALSE);
  83.   END;
  84.   RETURN FALSE
  85. END selGrEntry;
  86.  
  87. PROCEDURE groupToStr (entry, env : ADDRESS; VAR str : ARRAY OF CHAR);
  88.   VAR gr : GroupSelect.groupPtr;
  89.  
  90. BEGIN
  91.   gr := entry;
  92.   IF gr = NIL THEN RETURN END;
  93.   MagicStrings.Assign (gr^.name^,str);
  94. END groupToStr;
  95.  
  96. PROCEDURE buildGroup (entry, env : ADDRESS; VAR str : ARRAY OF CHAR);
  97.   VAR gr : GroupSelect.groupPtr;
  98.       newIdx,
  99.       lastIdx,
  100.       unrd,
  101.       new : CARDINAL;
  102.       numStr, unread : ARRAY [0..4] OF CHAR;
  103.       modePtr : envRecPtr;
  104.       
  105.   PROCEDURE card2str(new : CARDINAL; VAR numStr : ARRAY OF CHAR);
  106.     VAR appendK : BOOLEAN;
  107.         theStr  : ARRAY [0..1024] OF CHAR;
  108.         i,j     : CARDINAL;
  109.   BEGIN
  110.     IF new # 0
  111.     THEN
  112.       appendK := FALSE;
  113.       IF new > 999 THEN
  114.         new := new DIV 1000;
  115.         appendK := TRUE;
  116.       END;
  117.       MagicStrings.Assign(StrConv.CardToStr (new, 3), theStr);
  118.       IF appendK
  119.       THEN
  120.         MagicStrings.Delete (theStr, 0, 1);
  121.         MagicStrings.Append ("K", theStr);
  122.       END;
  123.       i := 0;
  124.       j := 1;
  125.       REPEAT
  126.         numStr[j] := theStr[i];
  127.         INC(i);
  128.         INC(j);
  129.       UNTIL (theStr[i] = 0C) OR (j >= HIGH(numStr));
  130.       (*
  131.       IF new > 99 THEN
  132.         numStr[1] := CHR(ORD('0') + CARDINAL(new DIV 100));
  133.       END;
  134.       IF new > 9 THEN
  135.         numStr[2] := CHR(ORD('0') + CARDINAL((new MOD 100) DIV 10));
  136.       END;
  137.       numStr[3] := CHR(ORD('0') + CARDINAL(new MOD 10));
  138.       *)
  139.     END;
  140.   END card2str;
  141.  
  142. BEGIN
  143.   gr := GroupSelect.groupPtr (entry);
  144.   modePtr := env;
  145.  
  146.   MagicStrings.Assign (gr^.name^,str);
  147.   (* Anzahl der neuen Nachrichten suchen *)
  148.   IF modePtr^.isReadMode
  149.   THEN
  150.     newIdx := data.FirstNewMsg (gr^.catNumber);
  151.     lastIdx := data.LastMsgOfGroup (gr^.catNumber);
  152.     IF (lastIdx # dataSys.empty) & (newIdx # dataSys.empty) & (newIdx <= lastIdx) THEN new := lastIdx - newIdx+1; 
  153.     ELSE new := 0
  154.     END;
  155.     MagicStrings.Assign ('     ', numStr);
  156.     card2str(new, numStr);
  157.  
  158.     unrd := data.unreadMsgCount(gr^.catNumber);
  159.     IF unrd = 0FFFFH THEN unrd := 0 END;
  160.     MagicStrings.Assign ('     ', unread);
  161.     card2str(unrd, unread);
  162.   
  163.     (* Jetzt noch L„ngenanpassung *)
  164.     IF LENGTH (str) < 40 THEN       (* YYY hier noch irgendwas sinnvolles einsetzen, das die L„nge rausfindet! *)
  165.       MagicStrings.Append (Strings.Space (40 (* 39 *) -LENGTH(str)), str);
  166.     ELSE
  167.       MagicStrings.Append ('  ', str);
  168.     END;
  169.     MagicStrings.Append (unread, str);
  170.     IF (new # 0 ) & (unrd # 0) THEN 
  171.       MagicStrings.Append ('|', str);
  172.     ELSE
  173.       MagicStrings.Append (' ', str);
  174.     END;
  175.     MagicStrings.Append (numStr, str);
  176.   END;
  177.   globalLength := BinOps.HigherInt (globalLength, LENGTH (str)+2);
  178. END buildGroup;
  179.  
  180. (*$Z-*)  
  181. PROCEDURE findSel (e, i : ADDRESS): BOOLEAN;
  182.   VAR entry : GroupSelect.groupPtr;
  183. BEGIN
  184.   entry := e;
  185.   RETURN entry^.selected;
  186. END findSel;
  187. (*$Z+*)
  188.  
  189. PROCEDURE cutEntry (obj: INTEGER; env, info : ADDRESS; VAR draw : BOOLEAN; VAR exit : BOOLEAN);
  190.   VAR r : GrafBase.Rectangle;
  191.       found : BOOLEAN;
  192.       listInfo : ListMan.LISTINFO;
  193. BEGIN
  194.   (* Selektierten Eintrag in der Liste finden und aus der Liste entfernen *)
  195.   Lists.ResetList (grList);
  196.   Lists.ScanEntries (grList, Lists.forward, findSel, NIL, found);
  197.   IF found THEN
  198.     clipEntry := Lists.CurrentEntry (grList);
  199.     Lists.RemoveEntry (grList, v.bool);
  200.     listInfo := ListMan.LISTINFO (info);
  201.     ListMan.ListScroll2Selection (listInfo, TRUE);
  202.     (* Nun das neue Icon darstellen *)
  203.     mtUtils.SetFlag (gruppen, MausTauschrsc.grcfull, MagicAES.HIDETREE, FALSE);
  204.     mtUtils.SetFlag (gruppen, MausTauschrsc.grcempty, MagicAES.HIDETREE, TRUE);
  205.     mtUtils.CalcArea (gruppen, MausTauschrsc.grcfull, r);
  206.     WinDials.WinDialDraw (gruppen, 0, 8, r, TRUE);
  207.   END;
  208.   mtUtils.SetState (gruppen, obj, MagicAES.SELECTED, FALSE);
  209.   WinDials.WinDialDraw (gruppen, obj, 1, v.r, FALSE);
  210.   draw := found;
  211.   exit := FALSE;
  212. END cutEntry;
  213.  
  214. PROCEDURE pasteEntry (obj: INTEGER; env, info: ADDRESS; VAR draw : BOOLEAN; VAR exit : BOOLEAN);
  215.   VAR r : GrafBase.Rectangle;
  216.       r1, r2 : GrafBase.Rectangle;
  217.       x, y   : INTEGER;
  218.       kstate, 
  219.       buts  : BITSET;
  220.       found : BOOLEAN;
  221.       index : LONGINT;
  222.       adr   : GroupSelect.groupPtr;
  223.       listInfo : ListMan.LISTINFO;
  224. BEGIN
  225.   mtUtils.ObjcArea (gruppen, MausTauschrsc.grcfull, r1);
  226.   mtUtils.ObjcArea (gruppen, 0, r2);
  227.   MagicAES.GrafMkstate (x, y, buts, kstate);
  228.   IF (0 IN buts)
  229.   THEN
  230.     listInfo := ListMan.LISTINFO (info);
  231.     MagicAES.GrafDragbox (r1, r2, x, y);
  232.     MagicAES.GrafMkstate (x, y, buts, kstate);
  233.     index := ListMan.ListClick (listInfo, x, y, kstate, 0);
  234.     (* Pers”nliche bleiben immer vorne: *)
  235.     IF index = 0 THEN INC (index) END;
  236.     IF index > 0
  237.     THEN
  238.       adr := ListMan.ListFindEntry (listInfo, index);
  239.       IF adr = NIL
  240.       THEN
  241.         Lists.AppendEntry (grList, clipEntry, v.bool);
  242.         index := VAL (LONGINT, Lists.NoOfEntries (grList));
  243.       ELSE
  244.         IF index > 1 THEN adr := Lists.PrevEntry (grList); END;
  245.         Lists.InsertEntry (grList, clipEntry, v.bool);
  246.       END;
  247.       (* Jetzt mal schnell alle Eintr„ge deselektieren *)
  248.       Lists.ResetList (grList);
  249.       adr := Lists.NextEntry (grList);
  250.       WHILE adr # NIL DO
  251.         adr^.selected := FALSE;
  252.         adr := Lists.NextEntry (grList);
  253.       END;
  254.       clipEntry^.selected := FALSE;
  255.       v.bool := selGrEntry (clipEntry, env, 0);
  256.       ListMan.ListScroll2Selection (listInfo, TRUE);
  257.       mtUtils.SetFlag (gruppen, MausTauschrsc.grcfull, MagicAES.HIDETREE, TRUE);
  258.       mtUtils.SetFlag (gruppen, MausTauschrsc.grcempty, MagicAES.HIDETREE, FALSE);
  259.       mtUtils.CalcArea (gruppen, MausTauschrsc.grcempty, r);
  260.       WinDials.WinDialDraw (gruppen, 0, 8, r, TRUE);
  261.       clipEntry := NIL;
  262.       draw := TRUE;
  263.     ELSE
  264.       draw := FALSE;
  265.     END;
  266.   ELSE
  267.     draw := FALSE;
  268.   END;
  269.   exit := FALSE;
  270. END pasteEntry;
  271.  
  272. PROCEDURE clipEmpty (obj: INTEGER; env, info : ADDRESS; VAR draw : BOOLEAN; VAR exit : BOOLEAN);
  273. BEGIN
  274.   MTE.InfoAlert (MTE.clipInfo, MTE.clipInfo2, "");
  275.   draw := FALSE;
  276.   exit := FALSE;
  277. END clipEmpty;
  278.  
  279. PROCEDURE helpButton (obj: INTEGER; env, info : ADDRESS; VAR draw : BOOLEAN; VAR exit : BOOLEAN);
  280.  VAR  modePtr : envRecPtr;
  281.       topic : CatHelp.tHelp;
  282. BEGIN
  283.   modePtr := env;
  284.   CASE modePtr^.mode OF
  285.     gsmReadBegin, 
  286.     gsmReadNew, 
  287.     gsmReadUnread, 
  288.     gsmReadLastPos, 
  289.     gsmReadDate, 
  290.     gsmGroupCom,
  291.     gsmReadId       : topic := CatHelp.groupRead; |
  292.     gsmWrite        : topic := CatHelp.groupWrite; |
  293.     gsmUser         : topic := CatHelp.groupUser; |
  294.     gsmChief,
  295.     gsmOther,
  296.     gsmModify       : topic := CatHelp.groupsel;  |
  297.   ELSE
  298.     topic := CatHelp.groupRead;
  299.   END;
  300.   CatHelp.DoHelp (topic);
  301.   mtUtils.ExclState (gruppen, obj, MagicAES.SELECTED);
  302.   WinDials.WinDialDraw (gruppen, obj, 1, v.r, FALSE);
  303.   draw := FALSE;
  304.   exit := FALSE;
  305. END helpButton;
  306.  
  307. PROCEDURE updateButton (entry, env : ADDRESS);
  308.   VAR oneSel : BOOLEAN;
  309.       gr     : GroupSelect.groupPtr;
  310.       modePtr: envRecPtr;
  311. BEGIN
  312.   modePtr := env;
  313.   Lists.ResetList (grList);
  314.   Lists.ScanEntries (grList, Lists.forward, findSel, NIL, oneSel);
  315.   oneSel := oneSel & (clipEntry = NIL);
  316.   IF oneSel
  317.   THEN
  318.     gr := Lists.CurrentEntry (grList);
  319.     oneSel := oneSel & (gr^.catNumber # dataSys.private);
  320.   END;
  321.   IF   (oneSel  & (mtUtils.InState (gruppen, MausTauschrsc.gdelete, MagicAES.DISABLED) OR 
  322.          mtUtils.InState (gruppen, MausTauschrsc.gchange, MagicAES.DISABLED)))
  323.     OR (~oneSel & (~mtUtils.InState (gruppen, MausTauschrsc.gdelete, MagicAES.DISABLED)
  324.         OR ~mtUtils.InState (gruppen, MausTauschrsc.gchange, MagicAES.DISABLED)))
  325.   THEN
  326.     mtUtils.SetState (gruppen, MausTauschrsc.gdelete, MagicAES.DISABLED, ~oneSel);
  327.     WinDials.WinDialDraw (gruppen, MausTauschrsc.gdelete, 0, v.r, FALSE);
  328.     mtUtils.SetState (gruppen, MausTauschrsc.gchange, MagicAES.DISABLED, ~oneSel);
  329.     WinDials.WinDialDraw (gruppen, MausTauschrsc.gchange, 0, v.r, FALSE);
  330.   END;
  331.   oneSel := (clipEntry = NIL);
  332.   IF   (oneSel  & mtUtils.InState (gruppen, MausTauschrsc.gok, MagicAES.DISABLED))
  333.     OR (~oneSel & ~mtUtils.InState (gruppen, MausTauschrsc.gok, MagicAES.DISABLED))
  334.   THEN
  335.     mtUtils.SetState (gruppen, MausTauschrsc.gok, MagicAES.DISABLED, ~oneSel);
  336.     WinDials.WinDialDraw (gruppen, MausTauschrsc.gok, 0, v.r, FALSE);
  337.     mtUtils.SetFlag  (gruppen, MausTauschrsc.gok, MagicAES.DEFAULT, oneSel);
  338.   END;
  339. END updateButton;
  340.  
  341. PROCEDURE allSelected (obj: INTEGER; env, info: ADDRESS; VAR draw : BOOLEAN; VAR exit : BOOLEAN);
  342. BEGIN
  343.   mtUtils.SetObjcString (gruppen, MausTauschrsc.newgroup, "");
  344.   WinDials.WinDialDraw (gruppen, MausTauschrsc.newgroup, 0, v.r, FALSE);
  345.   draw := FALSE;
  346.   exit := TRUE;
  347. END allSelected;
  348.  
  349. PROCEDURE sortGroupList (obj: INTEGER; env, info: ADDRESS; VAR draw, exit: BOOLEAN);
  350. BEGIN
  351.   GroupSelect.DeleteList (grList);
  352.  
  353.   v.bool := GroupSelect.GetReadList (grList, FALSE, FALSE, FALSE); 
  354.  
  355.   mtUtils.ExclState (gruppen, obj, MagicAES.SELECTED);
  356.   WinDials.WinDialDraw (gruppen, obj, 1, v.r, FALSE);
  357.   draw := TRUE;
  358.   exit := FALSE;
  359. END sortGroupList;
  360.  
  361. PROCEDURE switchWriteList (obj: INTEGER; env, info: ADDRESS; VAR draw, exit: BOOLEAN);
  362. BEGIN
  363.   GroupSelect.DeleteList (grList);
  364.   IF mtUtils.InState (gruppen, obj, MagicAES.SELECTED)
  365.   THEN
  366.     v.bool := GroupSelect.GetWriteList (grList, TRUE);
  367.     v.bool := ConfVars.SetConfigBool (cSmallWriteList, FALSE);
  368.   ELSE
  369.     (* Nur kleine Liste holen *)
  370.     v.bool := GroupSelect.GetWriteList (grList, FALSE);
  371.     v.bool := ConfVars.SetConfigBool (cSmallWriteList, TRUE);
  372.   END;
  373.   draw := TRUE;
  374.   exit := FALSE;
  375. END switchWriteList;
  376.  
  377. PROCEDURE changeGroup (obj: INTEGER; env, info: ADDRESS; VAR draw, exit: BOOLEAN);
  378. CONST cTitel    = 'Gruppe umbenennen';
  379.       cPreStr   = 'nach:';
  380.   VAR wegen: ADDRESS;
  381.       oldGruppe: ARRAY [0..255] OF CHAR;
  382.       gruppe: ARRAY [0..255] OF CHAR;
  383.       optStr: ARRAY [0..50] OF CHAR;
  384.       preStr: ARRAY [0..20] OF CHAR;
  385.       oneSel: BOOLEAN;
  386.       but   : INTEGER;
  387.       ok    : BOOLEAN;
  388.       gr    : GroupSelect.groupPtr;
  389. BEGIN
  390.   draw := FALSE;
  391.   wegen := MausTauschrsc.TreeAddr^[MausTauschrsc.wegen];
  392.   Lists.ResetList (grList);
  393.   Lists.ScanEntries (grList, Lists.forward, findSel, NIL, oneSel);
  394.   IF oneSel
  395.   THEN
  396.     gr := Lists.CurrentEntry (grList);
  397.     MagicStrings.Assign (gr^.name^, gruppe);
  398.     MagicStrings.Assign (gr^.name^, oldGruppe);
  399.     optStr := cTitel;
  400.     preStr := cPreStr;
  401.     mtUtils.SetObjcStringAdr (wegen, MausTauschrsc.wgruppe, ADR(oldGruppe));
  402.     mtUtils.SetObjcStringAdr (wegen, MausTauschrsc.optstr,  ADR(optStr));
  403.     mtUtils.SetObjcStringAdr (wegen, MausTauschrsc.prestr,  ADR(preStr));
  404.     mtUtils.SetObjcString (wegen, MausTauschrsc.wegenstr, "");
  405.     REPEAT
  406.       but := FormHandle (wegen);
  407.       draw := but # MausTauschrsc.wegcanc;
  408.       ok := TRUE;
  409.       IF draw
  410.       THEN
  411.         mtUtils.ObjcString (wegen, MausTauschrsc.wegenstr, gruppe);
  412.         IF gruppe[0] = 0C
  413.         THEN
  414.           MTE.info (MTE.emptyGroup);
  415.           ok := FALSE;
  416.         ELSIF GroupSelect.GroupNumber (gruppe, v.card)
  417.         THEN
  418.           MTE.info (MTE.doubleGroup);
  419.           ok := FALSE;
  420.         ELSE
  421.           IF ~GroupSelect.RenameGroup (gr^.name^, gruppe, TRUE)
  422.           THEN
  423.             MTE.info (MTE.noRenGroup);
  424.           ELSE
  425.             GroupSelect.DeleteList (grList);
  426.             v.bool := GroupSelect.GetReadList (grList, TRUE, FALSE, FALSE);
  427.           END;
  428.         END;
  429.       END;
  430.     UNTIL ok;
  431.   END;
  432.   mtUtils.ExclState (gruppen, obj, MagicAES.SELECTED);
  433.   WinDials.WinDialDraw (gruppen, obj, 1, v.r, FALSE);
  434.   exit := FALSE;
  435. END changeGroup;
  436.  
  437. (* List-Zwischen-Prozeduren *)
  438. PROCEDURE groupIsSelected (entry, env : ADDRESS) : BOOLEAN;
  439.   VAR ent : GroupSelect.groupPtr;
  440. BEGIN
  441.   ent := entry;
  442.   RETURN ent^.selected;
  443. END groupIsSelected;
  444.  
  445. PROCEDURE nameIsSelected (entry, env : ADDRESS) : BOOLEAN;
  446.   VAR ent : data.listEntryPtr;
  447. BEGIN
  448.   ent := data.listEntryPtr (entry);
  449.   RETURN ent^.selected;
  450. END nameIsSelected;
  451.  
  452. PROCEDURE nextEntry ( l : ADDRESS) : ADDRESS;
  453.  VAR lp : POINTER TO Lists.List;
  454. BEGIN
  455.  lp := l;
  456.  RETURN Lists.NextEntry (lp^);
  457. END nextEntry;
  458.  
  459. PROCEDURE prevEntry ( l : ADDRESS) : ADDRESS;
  460.  VAR lp : POINTER TO Lists.List;
  461. BEGIN
  462.  lp := l;
  463.  RETURN Lists.PrevEntry (lp^)
  464. END prevEntry;
  465.  
  466. PROCEDURE countEntries ( l : ADDRESS; VAR ll: LONGINT; VAR ww: INTEGER);
  467.  VAR lp : POINTER TO Lists.List;
  468. BEGIN
  469.  lp := l;
  470.  ww := globalLength*mtAppl.CharWidth;
  471.  ll := VAL (LONGINT, Lists.NoOfEntries (lp^));
  472. END countEntries;
  473.  
  474. PROCEDURE resetList (l : ADDRESS);
  475.  VAR lp : POINTER TO Lists.List;
  476. BEGIN
  477.  lp := l;
  478.  Lists.ResetList (lp^);
  479. END resetList;
  480.  
  481. PROCEDURE isEnabled (adr : ADDRESS; env : ADDRESS) : BOOLEAN;
  482. BEGIN
  483.   RETURN TRUE
  484. END isEnabled;
  485.  
  486. VAR  tr     : mtUtils.tObjcTree;
  487.  
  488. PROCEDURE drawGroupEntry (entry, env : ADDRESS; x, y : INTEGER;
  489.                           offset : INTEGER; clip   : GrafBase.Rectangle);
  490.  
  491.   CONST spaceString = "          ";
  492.      VAR e   : GroupSelect.groupPtr;
  493.          str : ARRAY [0..255] OF CHAR;
  494.   BEGIN
  495.     e := entry;
  496.     tr^[0].obX := x;
  497.     tr^[0].obY := y;
  498.     tr^[0].obSpec.TedPtr^.teTxtlen := globalLength;
  499.     tr^[0].obWidth := globalLength*mtAppl.CharWidth;
  500.     IF e # NIL
  501.     THEN
  502.       (* Jetzt hier den String fr den Gruppennamen zusammenbauen *)
  503.       buildGroup (e, env,  str);
  504.       mtUtils.SetObjcStringAdr (tr, 0, ADR(str));
  505.       mtUtils.SetState (tr, 0, MagicAES.SELECTED, groupIsSelected (entry, env));
  506.       mtUtils.SetState (tr, 0, MagicAES.DISABLED, ~isEnabled (entry, env));
  507.     ELSE
  508.       mtUtils.SetObjcStringAdr (tr, 0, CADR(spaceString));
  509.       mtUtils.SetState (tr, 0, MagicAES.SELECTED, FALSE);
  510.       mtUtils.SetState (tr, 0, MagicAES.DISABLED, FALSE);
  511.     END;
  512.     MagicAES.ObjcDraw (tr, 0, 8, clip);
  513.   END drawGroupEntry;
  514.  
  515. PROCEDURE setAndGetGroupValues (tree: ADDRESS; private: ADDRESS; set: BOOLEAN; exitBut: INTEGER);
  516.   VAR iPtr : envRecPtr;
  517. BEGIN
  518.   exitBut := INTEGER(BITSET(exitBut) - {15});
  519.   IF set
  520.   THEN
  521.   ELSE
  522.     iPtr := private;
  523.     iPtr^.exitBut := exitBut;
  524.   END;
  525. END setAndGetGroupValues;
  526.  
  527. PROCEDURE CheckStr(VAR str : ARRAY OF CHAR):BOOLEAN;
  528. VAR z : CARDINAL;
  529. BEGIN
  530.   Strings.DelLeadingBlanks (str);
  531.   Strings.DelTrailingBlanks (str);
  532.   z := MagicStrings.Length(str);
  533.   RETURN z > 0;
  534.   (*
  535.   z := MagicStrings.Length(str);
  536.   IF z > 0 THEN
  537.     DEC(z);
  538.     WHILE (z > 0) & (str[z] = ' ') DO DEC(z) END;
  539.     IF (z = 0) & (str[0] = ' ') THEN str[0] := 0C; RETURN FALSE END;
  540.     str[z+1] := 0C;
  541.     z := 0;
  542.     WHILE (z < HIGH(str)) & (str[z] = ' ') DO INC(z) END;
  543.     IF z = HIGH(str) THEN str[0] := 0C; RETURN FALSE END;
  544.     IF z > 0 THEN
  545.       MagicStrings.Delete(str, 0, z);
  546.     END;
  547.     RETURN TRUE
  548.   ELSE
  549.     RETURN FALSE
  550.   END;
  551.   *)
  552. END CheckStr;
  553.  
  554. PROCEDURE checkGroupExit (tree: ADDRESS; private: ADDRESS; button: INTEGER;
  555.                           group: ADDRESS; kState: BITSET): BOOLEAN;
  556.   VAR iPtr      : envRecPtr;
  557.       groupName : ARRAY [0..255] OF CHAR;
  558.       GroupOk   : BOOLEAN;
  559. BEGIN
  560.   iPtr := private;
  561.   button := INTEGER(BITSET(button) - {15});
  562.   IF (button = MausTauschrsc.gok) THEN
  563.     mtUtils.ObjcString (tree, MausTauschrsc.newgroup, groupName);
  564.     IF (group = NIL) & (iPtr^.mode # gsmModify) & (iPtr^.mode # gsmUser) & (iPtr^.mode # gsmChief)
  565.     THEN
  566.       (* Hier noch „ndern! *)
  567.       IF ~CheckStr(groupName) THEN
  568.         MTE.info (MTE.emptyGName);
  569.         GroupOk := FALSE;
  570.       ELSE (* IF ~nG THEN *)
  571.         GroupOk := GroupSelect.GroupNumber(groupName, v.card);
  572.         IF ~GroupOk (* & envRec.isReadMode *) THEN
  573.           MTE.info (MTE.groupNotFound);
  574.         END;
  575.       END;
  576.     ELSE
  577.       GroupOk := TRUE;
  578.     END;
  579.     IF ~GroupOk
  580.     THEN
  581.       mtUtils.ExclState(tree, button, MagicAES.SELECTED);
  582.       WinDials.WinDialDraw (tree, button, 0, v.r, FALSE);
  583.     END;
  584.     RETURN GroupOk;
  585.   END;
  586.   RETURN TRUE;
  587. END checkGroupExit;
  588.  
  589. (* Gruppenauswahl...*)
  590. PROCEDURE SelectGroup (VAR gruppe : ARRAY OF CHAR; VAR Nr: CARDINAL;
  591.                            nG     : BOOLEAN; clearEdit: BOOLEAN;
  592.                            forSearch: BOOLEAN; mode: groupSelectMode): BOOLEAN;
  593. VAR exit : INTEGER;
  594.  
  595.   TYPE  titleArray = ARRAY groupSelectMode OF ARRAY [0..44] OF CHAR;
  596.  
  597.   CONST titles     = titleArray{
  598.         'Ab Anfang lesen in Gruppe',
  599.         'Neue Nachrichten lesen in Gruppe',
  600.         'Ungelesene Nachrichten lesen in Gruppe',
  601.         'Ab letzter Position lesen in Gruppe',
  602.         'Ab Datum lesen in Gruppe',
  603.         'Ab Message-ID lesen in Gruppe',
  604.         'Neue Nachricht schreiben in Gruppe',
  605.         'User eintragen in Gruppe',
  606.         'Gruppe ausw„hlen',
  607.         'Gruppenliste modifizieren',
  608.         'Gruppe ausw„hlen',
  609.         'Gruppe ausw„hlen'};
  610.         
  611.   VAR specials : ARRAY [0..5] OF specialButHdler;
  612.       gr,
  613.       group    : GroupSelect.groupPtr;
  614.       found    : BOOLEAN;
  615.       GroupOk  : BOOLEAN;
  616.       maxLength: INTEGER;
  617.       r        : GrafBase.Rectangle;
  618.       ilProc   : inLoopProc;
  619.       whichList: BOOLEAN;
  620.       envRec   : envRecord;
  621.       dialHandler: ListDl.ldHandler;
  622.       
  623.  
  624. BEGIN
  625.   IF groupDialIsOpen
  626.   THEN
  627.     RETURN FALSE;
  628.   END;
  629.   (* Strings setzen *)
  630.   mtUtils.SetObjcString (gruppen, MausTauschrsc.gtitel, titles[mode]);
  631.   mtUtils.SetFlag  (gruppen, MausTauschrsc.gok, MagicAES.DEFAULT, TRUE);
  632.   (* Gruppenmodus bestimmen *)
  633.   envRec.isReadMode := FALSE;
  634.   envRec.mode := mode;
  635.   CASE mode OF
  636.     gsmReadBegin, 
  637.     gsmReadNew, 
  638.     gsmReadUnread, 
  639.     gsmReadLastPos, 
  640.     gsmReadDate, 
  641.     gsmReadId       : envRec.isReadMode := TRUE; |
  642.   ELSE
  643.   END;
  644.   
  645.   mtUtils.SetObjcString (gruppen, MausTauschrsc.gdelete, '[Klemmen');
  646.   mtUtils.SetObjcString (gruppen, MausTauschrsc.gchange, 'Ž[ndern...');
  647.   mtUtils.SetObjcString (gruppen, MausTauschrsc.gball, 'A[lle');
  648.   mtUtils.SetFlag (gruppen, MausTauschrsc.gchange, MagicAES.HIDETREE, mode # gsmModify);
  649.   mtUtils.SetFlag (gruppen, MausTauschrsc.gdelete, MagicAES.HIDETREE, mode # gsmModify);
  650.   mtUtils.SetFlag (gruppen, MausTauschrsc.grcempty, MagicAES.HIDETREE, mode # gsmModify);
  651.   (* mtUtils.SetFlag (gruppen, MausTauschrsc.ghelp, MagicAES.HIDETREE, mode # gsmModify); *)
  652.   mtUtils.SetFlag (gruppen, MausTauschrsc.grcfull, MagicAES.HIDETREE, TRUE);
  653.   mtUtils.SetFlag (gruppen, MausTauschrsc.gball,   MagicAES.HIDETREE, (mode # gsmWrite) & (mode # gsmGroupCom) & (mode # gsmModify));
  654.   mtUtils.SetFlag (gruppen, MausTauschrsc.gball, MagicAES.Exit, (mode = gsmGroupCom) OR (mode = gsmModify));
  655.   mtUtils.SetFlag (gruppen, MausTauschrsc.gball, MagicAES.TOUCHEXIT, mode = gsmWrite);
  656.   
  657.   IF mode = gsmWrite
  658.   THEN 
  659.     (* Nachsehen, welche Liste wir zuerst anfordern *)
  660.     ConfVars.GetConfDefBool (cSmallWriteList, whichList, TRUE);
  661.     mtUtils.SetState (gruppen, MausTauschrsc.gball, MagicAES.SELECTED, ~whichList);
  662.     v.bool := ConfVars.SetConfigBool (cSmallWriteList, whichList);
  663.   ELSIF mode = gsmModify
  664.   THEN
  665.     mtUtils.SetObjcString (gruppen, MausTauschrsc.gball, '[Sort');
  666.     mtUtils.SetState (gruppen, MausTauschrsc.gball, MagicAES.SELECTED, FALSE);
  667.   END;
  668.   
  669.   found := FALSE;
  670.   (* Editfeld l”schen *)
  671.   IF clearEdit THEN 
  672.     mtUtils.SetObjcString (gruppen, MausTauschrsc.newgroup, ''); 
  673.   ELSE
  674.     mtUtils.SetObjcString (gruppen, MausTauschrsc.newgroup, lastGroup); 
  675.   END;
  676.   (* specials bestimmen *)
  677.   specials[0].objc := MausTauschrsc.gdelete;
  678.   specials[0].proc := cutEntry;
  679.   specials[1].objc := MausTauschrsc.grcfull;
  680.   specials[1].proc := pasteEntry;
  681.   specials[2].objc := MausTauschrsc.grcempty;
  682.   specials[2].proc := clipEmpty;
  683.   specials[3].objc := MausTauschrsc.gball;
  684.   IF mode = gsmWrite
  685.   THEN
  686.     specials[3].proc := switchWriteList;
  687.   ELSIF mode = gsmModify
  688.   THEN
  689.     specials[3].proc := sortGroupList;
  690.   ELSE
  691.     specials[3].proc := allSelected;
  692.   END;
  693.   specials[4].objc := MausTauschrsc.gchange;
  694.   specials[4].proc := changeGroup;
  695.   specials[5].objc := MausTauschrsc.ghelp;
  696.   specials[5].proc := helpButton;
  697.   clipEntry := NIL;
  698.   IF ~forSearch
  699.   THEN
  700.     ilProc := updateButton;
  701.   ELSE
  702.     ilProc := dummyInLoop;
  703.   END;
  704.  
  705.   (* Jetzt die Liste anfordern beim Listenmodul *)
  706.   IF (mode = gsmUser) OR (mode = gsmChief)
  707.   THEN
  708.     v.bool := GroupSelect.GetUserList (grList); 
  709.   ELSIF (mode = gsmOther)
  710.   THEN
  711.     v.bool := GroupSelect.GetSelectList (grList, TRUE, GroupSelect.sName);
  712.   ELSIF envRec.isReadMode OR forSearch OR (mode = gsmModify)
  713.   THEN
  714.     v.bool := GroupSelect.GetReadList (grList, TRUE, mode = gsmReadNew, mode = gsmReadUnread); 
  715.   ELSE
  716.     IF mode = gsmWrite
  717.     THEN
  718.       v.bool := GroupSelect.GetWriteList (grList, ~whichList)
  719.     ELSE
  720.       v.bool := GroupSelect.GetWriteList (grList, TRUE);
  721.     END;
  722.   END;
  723.   IF ~v.bool THEN RETURN FALSE; END;
  724.  
  725.   (* Maximale Breite eines Listeneintrages herausfinden *)
  726.   maxLength := 0;
  727.   Lists.ResetList (grList);
  728.   group := Lists.NextEntry (grList);
  729.   WHILE group # NIL DO 
  730.     IF INTEGER(LENGTH (group^.name^)) > maxLength 
  731.     THEN
  732.       maxLength := LENGTH (group^.name^);
  733.     END;
  734.     group := Lists.NextEntry (grList);
  735.   END;
  736.   INC (maxLength, 9);   (* fr neue und ungelesene *)
  737.   
  738.   (* Jetzt das Object zusammenbauen *)
  739.   mtUtils.CalcArea (gruppen, MausTauschrsc.groupbox, r);
  740.   maxLength := BinOps.HigherInt (maxLength, r.w DIV mtAppl.CharWidth);
  741.   
  742.   globalLength := maxLength;
  743.  
  744.   (* Objectadresse holen *)
  745.   tr := MausTauschrsc.TreeAddr^[MausTauschrsc.listtxt];
  746.   
  747.   groupDialIsOpen := TRUE;
  748.   
  749.   (* WindowDialog vorbereiten *)
  750.   ListDl.BuildLdHandler (ADR(grList), resetList, nextEntry, prevEntry,
  751.                         countEntries, isEnabled, selGrEntry,
  752.                         groupToStr, groupIsSelected, drawGroupEntry,
  753.                         0, mtAppl.CharHeight, 
  754.                         8, globalLength*mtAppl.CharWidth,
  755.                         dialHandler);
  756.   (* ListWinDialog ”ffnen *)
  757.   IF ListDl.WinListDial (gruppen, ListDl.ldElemSet{ldSelect, ldArrows, ldDoubleExit, ldAutolocate, ldModal},
  758.                          dialHandler,
  759.                          MausTauschrsc.groupbox,
  760.                          MausTauschrsc.groupback,
  761.                          MausTauschrsc.gok,
  762.                          MausTauschrsc.gcancel,
  763.                          ADR(envRec), MausTauschrsc.gok,
  764.                          MausTauschrsc.newgroup,
  765.                          ilProc,
  766.                          specials,
  767.                          6,
  768.                          checkGroupExit,
  769.                          setAndGetGroupValues,
  770.                          setAndGetGroupValues,
  771.                          group)
  772.   THEN
  773.     exit := envRec.exitBut;
  774.     IF (exit = MausTauschrsc.gok) & (mode = gsmModify)
  775.     THEN
  776.       (* Jetzt neue Lesenummern vergeben *)
  777.       Lists.ResetList (grList);
  778.       maxLength := 0; (* Da Pers”nliche mit drin ist *)
  779.       gr := Lists.NextEntry (grList);
  780.       WHILE gr # NIL DO
  781.         gr^.readNumber := maxLength;
  782.         INC (maxLength);
  783.         gr := Lists.NextEntry (grList);
  784.       END;
  785.       v.bool := GroupSelect.UpdateReadList (grList);
  786.     END;
  787.   
  788.     IF exit # MausTauschrsc.gcancel THEN
  789.       found := TRUE;
  790.       IF (exit = MausTauschrsc.gball) & forSearch THEN
  791.         MagicStrings.Assign ("", gruppe);
  792.         Nr     := $FFFF;
  793.       ELSIF exit = MausTauschrsc.gok THEN
  794.         IF group = NIL
  795.         THEN
  796.           mtUtils.ObjcString (gruppen, MausTauschrsc.newgroup, gruppe);
  797.           (* Gruppennamen normalisieren *)
  798.           v.bool := CheckStr (gruppe);
  799.           GroupOk := GroupSelect.GroupNumber(gruppe, Nr);
  800.           IF ~GroupOk THEN
  801.             IF MagicStrings.Equal(dataSys.personalName, gruppe) THEN
  802.               Nr := dataSys.private
  803.             ELSIF ~nG
  804.             THEN
  805.               Nr := dataSys.maxGroup+1; (* darf so nicht bleiben..? *)
  806.               found := FALSE;
  807.               (* Soll andeuten, daž es sich um eine neue, unbekannte Gruppe handelt *)
  808.             END; (* sonst ist Nr schon richtig *)
  809.           END;
  810.         ELSE
  811.           MagicStrings.Assign (group^.name^, gruppe);
  812.           Nr := CARDINAL(group^.catNumber);
  813.         END;
  814.       END;
  815.     ELSE
  816.       found := FALSE
  817.     END;
  818.     MagicStrings.Assign (gruppe, lastGroup);
  819.   ELSE
  820.     found := FALSE;
  821.   END;
  822.   groupDialIsOpen := FALSE;
  823.   (* Gruppenliste wieder freigeben *)
  824.   GroupSelect.DeleteList (grList);
  825.   RETURN found;
  826. END SelectGroup;
  827.  
  828. (*------------------------------------------------------------------------*)
  829. CONST  TAB        = 11C;
  830.  
  831. PROCEDURE getName (REF s1: ARRAY OF CHAR; VAR s2 : ARRAY OF CHAR);
  832.   VAR p : INTEGER;
  833. BEGIN
  834.   p := Strings.PosLen (TAB, s1, 0);
  835.   Strings.Copy (s1, 0, p, s2, v.bool);
  836. END getName;
  837.  
  838. PROCEDURE getInfo (REF s1: ARRAY OF CHAR; VAR s2 : ARRAY OF CHAR);
  839.   VAR p : INTEGER;
  840. BEGIN
  841.   p := Strings.Pos (TAB, s1, 0);
  842.   IF p >= 0
  843.   THEN
  844.     Strings.Copy (s1, p+1, INTEGER(LENGTH (s1)) - p - 1, s2, v.bool);
  845.   ELSE
  846.     Strings.Assign (" ", s2, v.bool);
  847.   END;
  848. END getInfo;
  849.  
  850. PROCEDURE nameToStr (entry, env : ADDRESS; VAR str : ARRAY OF CHAR);
  851.   VAR gr : data.listEntryPtr;
  852. BEGIN
  853.   gr := data.listEntryPtr (entry);
  854.   IF gr = NIL THEN RETURN END;
  855.   getName (gr^.gName, str);
  856. END nameToStr;
  857.  
  858. PROCEDURE selNameEntry (entry, env : ADDRESS; line : INTEGER) : BOOLEAN;
  859.  VAR e : data.listEntryPtr;
  860.      str : ARRAY [0..255] OF CHAR;
  861. BEGIN
  862.   e := data.listEntryPtr (entry);
  863.   IF e = NIL THEN RETURN FALSE END;
  864.   e^.selected := ~e^.selected;
  865.   IF e^.selected & (line >= 0) THEN
  866.     getName (e^.gName, str);
  867.     mtUtils.SetObjcString(adr, MausTauschrsc.newadr, str);
  868.     WinDials.WinDialDraw (adr, MausTauschrsc.newadr, 0, v.r, FALSE);
  869.   END;
  870.   RETURN FALSE
  871. END selNameEntry;
  872.  
  873. (*$Z-*)  
  874. PROCEDURE findNameSel (e, i : ADDRESS): BOOLEAN;
  875.   VAR entry : data.listEntryPtr;
  876. BEGIN
  877.   entry := e;
  878.   RETURN entry^.selected;
  879. END findNameSel;
  880.  
  881. PROCEDURE findName (e, i : ADDRESS): BOOLEAN;
  882.   VAR entry : data.listEntryPtr;
  883.       s1    : ARRAY [0..255] OF CHAR;
  884.       s2p   : POINTER TO ARRAY [0..255] OF CHAR;
  885. BEGIN
  886.   entry := e;
  887.   s2p := i;
  888.   getName (entry^.gName, s1);
  889.   RETURN MagicStrings.Equal (s1, s2p^);
  890. END findName;
  891. (*$Z+*)
  892.  
  893. TYPE    nameInfo    = RECORD
  894.                         entry   : data.listEntryPtr;
  895.                         name,
  896.                         info    : ARRAY [0..255] OF CHAR;
  897.                         newName : ARRAY [0..255] OF CHAR;
  898.                         newInfo : ARRAY [0..255] OF CHAR;
  899.                         inList  : BOOLEAN;
  900.                         exitBut : INTEGER;
  901.                       END;
  902.                       
  903.         nameInfoPtr = POINTER TO nameInfo;
  904.  
  905. PROCEDURE nameButton (tree: ADDRESS; private: ADDRESS; button: INTEGER;
  906.                        mx, my : INTEGER; kstate: BITSET; clicks: INTEGER): BOOLEAN;
  907.   VAR nInfo : nameInfoPtr;
  908.       but   : INTEGER;
  909. BEGIN
  910.   nInfo := private;
  911.   WITH nInfo^ DO
  912.     but := INTEGER(BITSET(button) - {15}); (* Doppelclick entfernen *)
  913.     mtUtils.ExclState(tree, but, MagicAES.SELECTED);
  914.     IF but = MausTauschrsc.nbok
  915.     THEN
  916.       mtUtils.ObjcString (tree, MausTauschrsc.nbname1, newName);
  917.       IF LENGTH (newName) = 0
  918.       THEN
  919.         MTE.info (MTE.emptyAddr); 
  920.         WinDials.WinDialDraw (tree, but, 8, v.r, FALSE);
  921.         RETURN FALSE
  922.       ELSE
  923.         RETURN TRUE
  924.       END;
  925.     END;
  926.   END;
  927.   RETURN TRUE;
  928. END nameButton;
  929.  
  930. PROCEDURE nameGetSetValues (tree: ADDRESS; private: ADDRESS; 
  931.                             set: BOOLEAN; exit: INTEGER);
  932.   VAR nInfo : nameInfoPtr;
  933.       num   : CARDINAL;
  934.       but   : INTEGER;
  935. BEGIN
  936.   nInfo := private;
  937.   but := INTEGER(BITSET(exit) - {15}); (* Doppelclick entfernen *)
  938.   IF set
  939.   THEN
  940.     WITH nInfo^ DO
  941.       (* Nach Namen suchen *)
  942.       MagicStrings.Assign (name, newName);
  943.       MagicStrings.Assign (info, newInfo);
  944.       Lists.ResetList (data.names);
  945.       Lists.ScanEntries (data.names, Lists.forward, findName, ADR(name), inList);
  946.       IF inList
  947.       THEN
  948.         entry := Lists.CurrentEntry (data.names);
  949.         mtUtils.SetObjcString (tree, MausTauschrsc.nbtitle, 'Adresse „ndern');
  950.         IF info[0] = ''
  951.         THEN
  952.           getInfo (entry^.gName, newInfo);
  953.         END;
  954.       ELSE
  955.         mtUtils.SetObjcString (tree, MausTauschrsc.nbtitle, 'Neue Adresse');
  956.       END;
  957.       mtUtils.SetObjcString (tree, MausTauschrsc.nbname1, newName);
  958.       mtUtils.SetObjcString (tree, MausTauschrsc.nbinfo1, newInfo);
  959.     END;
  960.   ELSE
  961.     WITH nInfo^ DO
  962.       exitBut := but;
  963.       IF but = MausTauschrsc.nbok
  964.       THEN
  965.         mtUtils.ObjcString (tree, MausTauschrsc.nbinfo1, newInfo);
  966.  
  967.         (* den Namen haben wir schon ausgelesen *)
  968.         globalLength := BinOps.HigherInt (globalLength, LENGTH (newName)+1);
  969.         globalLength := BinOps.HigherInt (globalLength, LENGTH (newInfo)+3);
  970.         Strings.Append (TAB, newName, v.bool);
  971.         Strings.Append (newInfo, newName, v.bool);
  972.         IF inList
  973.         THEN
  974.           (* Eintrag „ndern *)
  975.           Lists.RemoveEntry (data.names, v.bool);
  976.           num := entry^.number;
  977.           DEALLOCATE (entry, 0);
  978.           ALLOCATE (entry, LENGTH (newName) + 7);
  979.           IF entry = NIL
  980.           THEN 
  981.             MTE.noMemAlert(); 
  982.           ELSE
  983.             WITH entry^ DO
  984.               len := LENGTH (newName);
  985.               number := num;
  986.               selected := TRUE;
  987.               Strings.Assign (newName, gName, v.bool);
  988.             END;
  989.             (* Neuen Eintrag anlegen *)
  990.             Lists.InsertEntry (data.names, entry, v.bool);
  991.             (* Liste speichern *)
  992.             data.SaveNames ();
  993.           END;
  994.         ELSE
  995.           data.AppendName (newName);
  996.         END;
  997.       END;
  998.     END;
  999.   END;
  1000. END nameGetSetValues;
  1001.  
  1002.  
  1003. PROCEDURE NewNameEntry (name, info : ARRAY OF CHAR);
  1004. (* Fhrt den Dialog fr einen neuen Namen durch 
  1005.  *)
  1006. VAR
  1007.       tree      : mtUtils.tObjcTree;
  1008.       nInfo     : nameInfoPtr;
  1009. BEGIN
  1010.   (* Baumadresse holen *)
  1011.   tree := MausTauschrsc.TreeAddr^[MausTauschrsc.namebox];
  1012.   NEW (nInfo);
  1013.   IF nInfo = NIL
  1014.   THEN
  1015.     MTE.noMemAlert();
  1016.     RETURN 
  1017.   END;
  1018.   (* Nach Namen suchen *)
  1019.   MagicStrings.Assign (name, nInfo^.name);
  1020.   MagicStrings.Assign (info, nInfo^.info);
  1021.  
  1022.   IF WinDials.OpenWinDial (tree, TRUE, 
  1023.                            nameGetSetValues,
  1024.                            nameGetSetValues,
  1025.                            nameButton,
  1026.                            WinDials.defDraw,
  1027.                            "",
  1028.                            nInfo)
  1029.   THEN
  1030.     WinDials.WinDialHandleEvents ();
  1031.   ELSE
  1032.     MTE.info (MTE.NoWinDial);
  1033.   END;
  1034.   DISPOSE (nInfo);
  1035. END NewNameEntry;
  1036.  
  1037. PROCEDURE newEntry (obj : INTEGER; env, env2: ADDRESS; VAR draw, exit : BOOLEAN);
  1038.   VAR name, 
  1039.       info : ARRAY [0..255] OF CHAR;
  1040.       oneSel    : BOOLEAN;
  1041.       entry     : data.listEntryPtr;
  1042. BEGIN
  1043.   (* selektieren Eintrag finden *)
  1044.   Lists.ResetList (data.names);
  1045.   Lists.ScanEntries (data.names, Lists.forward, findNameSel, NIL, oneSel);
  1046.   IF oneSel
  1047.   THEN
  1048.     entry := Lists.CurrentEntry (data.names);
  1049.     getName (entry^.gName, name);
  1050.     getInfo (entry^.gName, info);
  1051.   ELSE
  1052.     mtUtils.ObjcString (adr, MausTauschrsc.newadr, name);
  1053.     Strings.Assign ("", info, v.bool);
  1054.   END;  
  1055.   NewNameEntry (name, info);
  1056.   mtUtils.ExclState (adr, obj, MagicAES.SELECTED);
  1057.   WinDials.WinDialDraw (adr, obj, 0, v.r, FALSE);
  1058.   draw := TRUE;
  1059.   exit := FALSE;
  1060. END newEntry;
  1061.  
  1062. PROCEDURE delEntry (obj : INTEGER; env, info: ADDRESS; VAR draw, exit : BOOLEAN);
  1063.   VAR oneSel    : BOOLEAN;
  1064.       entry     : data.listEntryPtr;
  1065.       num       : CARDINAL;
  1066. BEGIN
  1067.   draw := FALSE;
  1068.   (* selektieren Eintrag finden *)
  1069.   Lists.ResetList (data.names);
  1070.   Lists.ScanEntries (data.names, Lists.forward, findNameSel, NIL, oneSel);
  1071.   IF oneSel
  1072.   THEN
  1073.     v.int := mtAlerts.Alert (1, MTE.delNameAlt);
  1074.     IF v.int = 1
  1075.     THEN
  1076.       entry := Lists.CurrentEntry (data.names);
  1077.       num := entry^.number;
  1078.       Lists.RemoveEntry (data.names, v.bool);
  1079.       Lists.ResetList (data.names);
  1080.       entry := Lists.NextEntry (data.names);
  1081.       WHILE entry # NIL DO
  1082.         IF entry^.number > num
  1083.         THEN
  1084.           DEC (entry^.number)
  1085.         END;
  1086.         entry := Lists.NextEntry (data.names);
  1087.       END;
  1088.       (* Liste jetzt noch speichern *)
  1089.       data.SaveNames();
  1090.       draw := TRUE;
  1091.     END;
  1092.   END;
  1093.   mtUtils.ExclState (adr, obj, MagicAES.SELECTED);
  1094.   WinDials.WinDialDraw (adr, obj, 0, v.r, FALSE);
  1095.   exit := FALSE;
  1096. END delEntry;
  1097.  
  1098. VAR isChange : BOOLEAN;
  1099.  
  1100. PROCEDURE updateNameButton (entry, env : ADDRESS);
  1101.   VAR oneSel : BOOLEAN;
  1102. BEGIN
  1103.   Lists.ResetList (data.names);
  1104.   Lists.ScanEntries (data.names, Lists.forward, findNameSel, NIL, oneSel);
  1105.   IF   (oneSel  & mtUtils.InState (adr, MausTauschrsc.deluser, MagicAES.DISABLED))
  1106.     OR (~oneSel & ~mtUtils.InState (adr, MausTauschrsc.deluser, MagicAES.DISABLED))
  1107.   THEN
  1108.     mtUtils.SetState (adr, MausTauschrsc.deluser, MagicAES.DISABLED, ~oneSel);
  1109.     WinDials.WinDialDraw (adr, MausTauschrsc.deluser, 0, v.r, FALSE);
  1110.   END;
  1111.   IF oneSel & ~isChange
  1112.   THEN
  1113.     mtUtils.SetObjcString (adr, MausTauschrsc.newuser, 'Ž[ndern...');
  1114.     WinDials.WinDialDraw (adr, MausTauschrsc.newuser, 0, v.r, FALSE);
  1115.     isChange := TRUE;
  1116.   ELSIF ~oneSel & isChange
  1117.   THEN
  1118.     mtUtils.SetObjcString (adr, MausTauschrsc.newuser, '  [Neu    ');
  1119.     WinDials.WinDialDraw (adr, MausTauschrsc.newuser, 0, v.r, FALSE);
  1120.     isChange := FALSE;
  1121.   END;
  1122. END updateNameButton;
  1123.  
  1124. PROCEDURE drawNameEntry (entry, env : ADDRESS; x, y : INTEGER;
  1125.                          offset : INTEGER; clip   : GrafBase.Rectangle);
  1126.  
  1127.   CONST spaceString = "          ";
  1128.      VAR e   : data.listEntryPtr;
  1129.          str : ARRAY [0..255] OF CHAR;
  1130.   BEGIN
  1131.     e := entry;
  1132.     tr^[0].obX := x;
  1133.     tr^[0].obY := y;
  1134.     tr^[0].obSpec.TedPtr^.teTxtlen := globalLength;
  1135.     tr^[0].obWidth := globalLength*mtAppl.CharWidth;
  1136.     IF e # NIL
  1137.     THEN
  1138.       (* Jetzt hier den String fr den Gruppennamen zusammenbauen *)
  1139.       getName (e^.gName, str);
  1140.       mtUtils.SetObjcStringAdr (tr, 0, ADR(str));
  1141.       mtUtils.SetState (tr, 0, MagicAES.SELECTED, nameIsSelected (entry, env));
  1142.       mtUtils.SetState (tr, 0, MagicAES.DISABLED, ~isEnabled (entry, env));
  1143.       MagicAES.ObjcDraw (tr, 0, 8, clip);
  1144.       INC (tr^[0].obY, mtAppl.CharHeight);
  1145.       getInfo (e^.gName, str);
  1146.       MagicStrings.Insert ("  ", str, 0);
  1147.     ELSE
  1148.       mtUtils.SetObjcStringAdr (tr, 0, CADR(spaceString));
  1149.       mtUtils.SetState (tr, 0, MagicAES.SELECTED, FALSE);
  1150.       mtUtils.SetState (tr, 0, MagicAES.DISABLED, FALSE);
  1151.       MagicAES.ObjcDraw (tr, 0, 8, clip);
  1152.       INC (tr^[0].obY, mtAppl.CharHeight);
  1153.     END;
  1154.     MagicAES.ObjcDraw (tr, 0, 8, clip);
  1155.   END drawNameEntry;
  1156.  
  1157. PROCEDURE setAndGetNameValues (tree: ADDRESS; private: ADDRESS; set: BOOLEAN; exitBut: INTEGER);
  1158.   VAR iPtr : POINTER TO INTEGER;
  1159. BEGIN
  1160.   IF set
  1161.   THEN
  1162.   ELSE
  1163.     iPtr := private;
  1164.     iPtr^ := exitBut;
  1165.   END;
  1166. END setAndGetNameValues;
  1167.  
  1168. PROCEDURE SelectName(VAR Name : ARRAY OF CHAR):BOOLEAN;
  1169. VAR exit     : INTEGER;
  1170.     strPtr   : POINTER TO ARRAY [0..255] OF CHAR;
  1171.     specials : ARRAY [0..1] OF specialButHdler;
  1172.     selAdr   : data.listEntryPtr;
  1173.     maxLength: INTEGER;
  1174.     r        : GrafBase.Rectangle;
  1175.     str      : ARRAY [0..255] OF CHAR;
  1176.     dialHandler: ListDl.ldHandler;
  1177.     name     : ARRAY [0..255] OF CHAR;
  1178.  
  1179. BEGIN
  1180.   IF nameDialIsOpen 
  1181.   THEN
  1182.     RETURN FALSE;
  1183.   END;
  1184.   mtUtils.SetObjcString (adr, MausTauschrsc.newadr, Name);
  1185.  
  1186.   mtUtils.SetObjcString (adr, MausTauschrsc.newuser, '  [Neu    ');
  1187.   isChange := FALSE;
  1188.   
  1189.   (* Maximale Breite eines Listeneintrages herausfinden *)
  1190.   maxLength := 0;
  1191.   Lists.ResetList (data.names);
  1192.   selAdr := Lists.NextEntry (data.names);
  1193.   WHILE selAdr # NIL DO
  1194.     selAdr^.selected := FALSE;
  1195.     getName (selAdr^.gName, str); 
  1196.     IF INTEGER(LENGTH (str)+1) > maxLength 
  1197.     THEN
  1198.       maxLength := LENGTH (str)+1;
  1199.     END;
  1200.     getInfo (selAdr^.gName, str);
  1201.     IF INTEGER(LENGTH (str)+3) > maxLength 
  1202.     THEN
  1203.       maxLength := LENGTH (str)+3;
  1204.     END;
  1205.     selAdr := Lists.NextEntry (data.names);
  1206.   END;
  1207.   
  1208.   (* Jetzt das Object zusammenbauen *)
  1209.   mtUtils.CalcArea (adr, MausTauschrsc.adrbox, r);
  1210.   maxLength := BinOps.HigherInt (maxLength, r.w DIV mtAppl.CharWidth);
  1211.   
  1212.   globalLength := maxLength;
  1213.  
  1214.   (* Objectadresse holen *)
  1215.   tr := MausTauschrsc.TreeAddr^[MausTauschrsc.listtxt];
  1216.   
  1217.   (* specials bestimmen *)
  1218.   specials[0].objc := MausTauschrsc.newuser;
  1219.   specials[0].proc := newEntry;
  1220.   specials[1].objc := MausTauschrsc.deluser;
  1221.   specials[1].proc := delEntry;
  1222.  
  1223.   nameDialIsOpen := TRUE;
  1224.   (* WindowDialog vorbereiten *)
  1225.   ListDl.BuildLdHandler (ADR(data.names), resetList, nextEntry, prevEntry,
  1226.                   countEntries, isEnabled, selNameEntry,
  1227.                   nameToStr, nameIsSelected, drawNameEntry,
  1228.                   0, 2*mtAppl.CharHeight, 
  1229.                   8, globalLength*mtAppl.CharWidth,
  1230.                   dialHandler);
  1231.   (* ListWinDialog ”ffnen *)
  1232.   IF ListDl.WinListDial (adr, ListDl.ldElemSet{ldSelect, ldArrows, ldDoubleExit, ldAutolocate, ldModal},
  1233.                   dialHandler,
  1234.                   MausTauschrsc.adrbox,
  1235.                   MausTauschrsc.adrback,
  1236.                   MausTauschrsc.adrok,
  1237.                   MausTauschrsc.adrcance,
  1238.                   ADR(exit), MausTauschrsc.adrok,
  1239.                   MausTauschrsc.newadr,
  1240.                   updateNameButton,
  1241.                   specials,
  1242.                   2,
  1243.                   ListDl.dummyCheckExit,
  1244.                   setAndGetNameValues,
  1245.                   setAndGetNameValues,
  1246.                   v.a)
  1247.   THEN
  1248.     nameDialIsOpen := FALSE;
  1249.     mtUtils.ObjcString (adr, MausTauschrsc.newadr, name);
  1250.     IF (exit = MausTauschrsc.adrok) & (name[0] = 0C) THEN
  1251.       RETURN FALSE;
  1252.     END;
  1253.     IF exit # MausTauschrsc.adrcance THEN
  1254.       MagicStrings.Assign(name, Name);
  1255.       RETURN TRUE
  1256.     END;
  1257.   END;
  1258.   nameDialIsOpen := FALSE;
  1259.   RETURN FALSE
  1260. END SelectName;
  1261.  
  1262. PROCEDURE SetLastGroup (REF name : ARRAY OF CHAR);
  1263. BEGIN
  1264.   MagicStrings.Assign (name, lastGroup);
  1265. END SetLastGroup;
  1266.  
  1267. PROCEDURE Init(g, a : ADDRESS);
  1268. (* Objektb„ume fr die Gruppenauswahl- und die Adressenauswahlbox *)
  1269. BEGIN
  1270.   gruppen := g;
  1271.   adr     := a;
  1272. END Init;
  1273.  
  1274. BEGIN
  1275.   groupDialIsOpen := FALSE;
  1276.   nameDialIsOpen := FALSE;
  1277. END ListHelp.
  1278.